package offer;

public class Offer29 {

    public int[] spiralOrder1(int[][] matrix) {
        int xlength = matrix.length;
        int  ylength= matrix[0].length;
        int size=xlength*ylength;
        int[] res = new int[size];
        int count=0;
        for (int i = 0; i < xlength; i++) {
            if ((i&1)==0){
                for (int j = 0; j <ylength ; j++) {
                    res[count++]=matrix[i][j];
                }
            }
            else {
                for (int j = ylength-1; j >=0 ; j--) {
                    res[count++]=matrix[i][j];

                }

            }

        }
        return  res;
    }



        public int[] spiralOrder(int[][] matrix) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
                return new int[0];
            }
            int rows = matrix.length, columns = matrix[0].length;
            boolean[][] visited = new boolean[rows][columns];
            int total = rows * columns;
            int[] order = new int[total];
            int row = 0, column = 0;
            int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
            int directionIndex = 0;

            for (int i = 0; i < total; i++) {
                order[i] = matrix[row][column];
                visited[row][column] = true;
                int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
                if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
                    directionIndex = (directionIndex + 1) % 4;
                }
                row += directions[directionIndex][0];
                column += directions[directionIndex][1];
            }
            return order;
        }

    public static void main(String[] args) {
        Offer29 offer29 = new Offer29();
        int[][] nums={{1,2,3},{4,5,6},{7,8,9}};
        int[] ints = offer29.spiralOrder(nums);
        for (int a:ints) {
            System.out.println(a);
        }
    }


}
